package jsp;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 石小俊
 * @date 2023年07月03日 10:18
 */
@WebServlet("/app")
public class ApplicationServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取application对象,即获取ServletContext对象
        // 获取该对象时,存在几种方式
        // 方式一:仅限在Servlet中获取
        // 在GenericServlet中提供了获取该对象的方法,可以直接调用即可
        ServletContext application = getServletContext();
        System.out.println(application);
        // 方式二:通用型,不限于Servlet,但是获取时方法的参数必须包含request或者session
        ServletContext application2 = request.getServletContext();
        System.out.println(application2);
        HttpSession session = request.getSession();
        ServletContext application3 = session.getServletContext();
        System.out.println(application3);
        // 通过上述三种方法均能获取到对应的ServletContext对象
        // 且获取的对象始终是同一个对象
        // 因为在一个应用中有且仅有一个application

        // 应用场景
        // 1.获取服务器所在位置
        // 方法参数可以为空,如果为空表示服务器根目录
        String path = application.getRealPath("");
        System.out.println("服务器根目录:"+path);
        // 方法可以有参数,参数表示的是相对于服务器根目录的路径
        // 该路径可以是抽象路径,即:当前可以不存在该路径
        // 方法的返回值为:服务器根目录+方法参数
        path = application.getRealPath("/upload/"+new SimpleDateFormat("yyyyMMdd").format(new Date()));
        System.out.println("path:"+path);
        // 此时获取的路径可能并不存在,可以通过后台代码创建对应的目录
        File file = new File(path);
        file.mkdirs();

        // 2.存储数据
        // 该方式开发中不建议使用,会导致服务器负载过高
        application.setAttribute("msg","Hello application");

        // 3.获取全局初始化参数
        // 通过application对象提供的方法获取全局初始化参数
        String name = application.getInitParameter("name");
        System.out.println("全局初始化参数name的值为:"+name);


    }
}
